﻿using OT.HikiSecureCenterApis.Req;
using OT.HikiSecureCenterApis.Res;
using OT.HikiSecureCenterApis.Service.Video.Req;
using OT.HikiSecureCenterApis.Service.Video.Res;
namespace OT.HikiSecureCenterApis.Service.Video
{
    /// <summary>
    /// 视频应用服务 --> 视频能力
    /// </summary>
    public partial class VideoService : ServiceBase
    {
        public VideoService(HikiSecureCenterApis _SecureCenterApis) : base(_SecureCenterApis) { }
        /// <summary>
        /// 获取监控点预览取流URLv2  /api/video/v2/cameras/previewURLs
        /// 1.平台正常运行；平台已经添加过设备和监控点信息。
        /// 2.平台需要安装mgc取流服务。
        /// 3.通过openAPI获取到监控点数据，依据自身业务开发监控点导航界面。
        /// 4.根据监控点编号调用本接口获取预览取流URL，协议类型包括：hik、rtsp、rtmp、hls、ws。
        /// 5.通过开放平台的开发包进行实时预览或者使用标准的GUI播放工具进行实时预览。
        /// 6.为保证数据的安全性，取流URL设有有效时间，有效时间为5分钟。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.4及以上版本</remarks>
        /// <param name="cameraIndexCode">必填 监控点唯一标识，分页获取监控点资源接口获取返回参数cameraIndexCode</param>
        /// <param name="streamType">非必填 码流类型，0:主码流 1:子码流 2:第三码流 参数不填，默认为主码流</param>
        /// <param name="protocol">非必填 取流协议（应用层协议），
        /// “hik”:HIK私有协议，使用视频SDK进行播放时，传入此类型；
        /// “rtsp”:RTSP协议；
        /// “rtmp”:RTMP协议（RTMP协议只支持海康SDK协议、EHOME协议、ONVIF协议接入的设备；只支持H264视频编码和AAC音频编码）；
        /// “hls”:HLS协议（HLS协议只支持海康SDK协议、EHOME协议、ONVIF协议接入的设备；只支持H264视频编码和AAC音频编码）；
        /// “ws”:Websocket协议（一般用于H5视频播放器取流播放）。
        /// 参数不填，默认为HIK协议</param>
        /// <param name="transmode">非必填 传输协议（传输层协议），0:UDP 1:TCP 默认是TCP 注：GB28181 2011及以前版本只支持UDP传输</param>
        /// <param name="expand">非必填 标识扩展内容，格式：key=value，
        /// 调用方根据其播放控件支持的解码格式选择相应的封装类型；
        /// 多个扩展时，以“&”隔开；
        /// 支持的内容详见附录F expand扩展内容说明</param>
        /// <param name="streamform">非必填 输出码流转封装格式，“ps”:PS封装格式、“rtp”:RTP封装协议。当protocol=rtsp时生效，且不传值时默认为RTP封装协议。</param>
        /// <returns><see cref="ResUrl"/></returns>
        public async Task<ResParameter<ResUrl>?> CameraPreviewUrlAsync(string cameraIndexCode, int streamType = 0,
            string protocol = "hik", int transmode = 1, string expand = null, string streamform = null) =>
          await SecureCenterApis.PostAsync<ResUrl>("/api/video/v2/cameras/previewURLs", 1.4, new
          {
              cameraIndexCode = cameraIndexCode,
              streamType = streamType,
              protocol = protocol,
              transmode = transmode,
              expand = expand,
              streamform = streamform
          });
        /// <summary>
        /// 获取监控点回放取流URLv2 /api/video/v2/cameras/playbackURLs
        /// 1.平台正常运行；平台已经添加过设备和监控点信息。
        /// 2.平台需要安装mgc取流服务。
        /// 3.通过openAPI获取到监控点数据，依据自身业务开发监控点导航界面。
        /// 4.根据监控点编号和回放起止时间调用本接口获取回放取流URL，协议类型包括：hik、rtsp、rtmp、hls（只支持云存储）。
        /// 5.通过开放平台的开发包进行录像回放或者使用标准的GUI播放工具进行录像回放。（开发包使用说明参考开发包的使用说明文档）。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.4及以上版本</remarks>
        /// <param name="cameraIndexCode">必填 监控点唯一标识，分页获取监控点资源接口获取返回参数cameraIndexCode</param>
        /// <param name="beginTime">必填 开始查询时间（IOS8601格式：yyyy-MM-dd’T’HH:mm:ss.SSSXXX）例如北京时间：2017-06-14T00:00:00.000+08:00，参考附录B ISO8601时间格式说明</param>
        /// <param name="endTime">必填 	结束查询时间，开始时间和结束时间相差不超过三天；（IOS8601格式：yyyy-MM-dd’T’HH:mm:ss.SSSXXX）例如北京时间：2017-06-15T00:00:00.000+08:00，参考附录B ISO8601时间格式说明</param>
        /// <param name="recordLocation">非必填 存储类型,0：中心存储 1：设备存储 默认为中心存储</param>
        /// <param name="lockType">非必填 查询录像的锁定类型，0-查询全部录像；1-查询未锁定录像；2-查询已锁定录像，不传默认值为0。通过录像锁定与解锁接口来进行录像锁定与解锁。</param>
        /// <param name="uuid">非必填 分页查询id，上一次查询返回的uuid，用于继续查询剩余片段，默认为空字符串。当存储类型为设备存储时，该字段生效，中心存储会一次性返回全部片段。</param>
        /// <param name="streamType">非必填 码流类型，0:主码流 1:子码流 2:第三码流 参数不填，默认为主码流</param>
        /// <param name="protocol">非必填 取流协议（应用层协议），
        /// “hik”:HIK私有协议，使用视频SDK进行播放时，传入此类型；
        /// “rtsp”:RTSP协议；
        /// “rtmp”:RTMP协议（RTMP协议只支持海康SDK协议、EHOME协议、ONVIF协议接入的设备；只支持H264视频编码和AAC音频编码）；
        /// “hls”:HLS协议（HLS协议只支持海康SDK协议、EHOME协议、ONVIF协议接入的设备；只支持H264视频编码和AAC音频编码）；
        /// “ws”:Websocket协议（一般用于H5视频播放器取流播放）。
        /// 参数不填，默认为HIK协议</param>
        /// <param name="transmode">非必填 传输协议（传输层协议），0:UDP 1:TCP 默认是TCP 注：GB28181 2011及以前版本只支持UDP传输</param>
        /// <param name="expand">非必填 标识扩展内容，格式：key=value，
        /// 调用方根据其播放控件支持的解码格式选择相应的封装类型；
        /// 多个扩展时，以“&”隔开；
        /// 支持的内容详见附录F expand扩展内容说明</param>
        /// <param name="streamform">非必填 输出码流转封装格式，“ps”:PS封装格式、“rtp”:RTP封装协议。当protocol=rtsp时生效，且不传值时默认为RTP封装协议。</param>
        /// <returns><see cref="ResCameraPlayBackUrl"/></returns>
        public async Task<ResParameter<ResCameraPlayBackUrl>?> CameraPlayBackAsync(string cameraIndexCode, string beginTime, string endTime,
            int recordLocation = 0, int lockType = 0, string uuid = null, int streamType = 0,
            string protocol = "hik", int transmode = 1, string expand = null, string streamform = null) =>
          await SecureCenterApis.PostAsync<ResCameraPlayBackUrl>("/api/video/v2/cameras/playbackURLs", 1.4, new
          {
              cameraIndexCode = cameraIndexCode,
              beginTime = beginTime,
              endTime = endTime,
              recordLocation = recordLocation,
              lockType = lockType,
              uuid = uuid,
              streamType = streamType,
              protocol = protocol,
              transmode = transmode,
              expand = expand,
              streamform = streamform
          });
        /// <summary>
        /// 查询对讲URL /api/video/v1/cameras/talkURLs
        /// 该接口用于获取监控点的对讲url，为保证数据的安全性，URL设有有效时间，有效时间为5分钟。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.2及以上版本</remarks>
        /// <param name="cameraIndexCode">必填 监控点唯一标识，分页获取监控点资源接口获取返回参数cameraIndexCode</param>
        /// <param name="transmode">非必填 传输协议（传输层协议），0:UDP 1:TCP 默认是TCP 注：GB28181 2011及以前版本只支持UDP传输</param>
        /// <param name="expand">非必填 标识扩展内容，格式：key=value，
        /// 调用方根据其播放控件支持的解码格式选择相应的封装类型；
        /// 多个扩展时，以“&”隔开；
        /// 支持的内容详见附录F expand扩展内容说明</param>
        /// <param name="eurlExpand">非必填 url扩展字段,生成取流短连接扩展字段，按照取流客户端对url特殊字段校验，可添加该字段至生成的短连接末尾</param>
        /// <returns><see cref="ResUrl"/></returns>
        public async Task<ResParameter<ResUrl>?> CameraTalkUrlAsync(string cameraIndexCode, int transmode = 1, string expand = null, string eurlExpand = null) =>
          await SecureCenterApis.PostAsync<ResUrl>("/api/video/v1/cameras/talkURLs", 1.2, new
          {
              cameraIndexCode = cameraIndexCode,
              transmode = transmode,
              expand = expand,
              eurlExpand = eurlExpand
          });
        /// <summary>
        /// 根据监控点编号进行云台操作 /api/video/v1/ptzs/controlling
        /// 根据监控点编号进行云台操作接口
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.0及以上版本</remarks>
        /// <param name="cameraIndexCode">必填 监控点唯一标识，分页获取监控点资源接口获取返回参数cameraIndexCode</param>
        /// <param name="action">必填 0-开始 ，1-停止 注：GOTO_PRESET命令下填任意值均可转到预置点,建议填0即可</param>
        /// <param name="command">必填 不区分大小写 说明：LEFT 左转 RIGHT右转 UP 上转 DOWN 下转 ZOOM_IN 焦距变大
        /// ZOOM_OUT 焦距变小 LEFT_UP 左上 LEFT_DOWN 左下 RIGHT_UP 右上 RIGHT_DOWN 右下 FOCUS_NEAR 焦点前移 FOCUS_FAR 焦点后移 IRIS_ENLARGE 光圈扩大
        /// IRIS_REDUCE 光圈缩小 WIPER_SWITCH 接通雨刷开关 START_RECORD_TRACK 开始记录轨迹 STOP_RECORD_TRACK 停止记录轨迹 START_TRACK 开始轨迹
        /// STOP_TRACK 停止轨迹；以下命令presetIndex不可为空：GOTO_PRESET到预置点</param>
        /// <param name="speed">非必填 云台速度，取值范围为1-100，默认50</param>
        /// <param name="presetIndex">非必填 预置点编号，可通过查询预置点信息接口获取整数，通常在300以内</param>
        /// <returns><see cref="ResParameter{T}"/></returns>
        public async Task<ResParameter<object>?> PtzsControlAsync(string cameraIndexCode, int action, string command, int speed = 50, int presetIndex = 0) =>
          await SecureCenterApis.PostAsync<object>("/api/video/v1/ptzs/controlling", 1.0, new
          {
              cameraIndexCode = cameraIndexCode,
              action = action,
              command = command.ToString(),
              speed = speed,
              presetIndex = presetIndex
          });
        /// <summary>
        /// 手动抓图 /api/video/v1/manualCapture
        /// 根据监控点编号进行云台操作接口
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.2及以上版本</remarks>
        /// <param name="cameraIndexCode">必填 监控点唯一标识，分页获取监控点资源接口获取返回参数cameraIndexCode</param>
        /// <returns><see cref="ResPicUrl"/></returns>
        public async Task<ResParameter<ResPicUrl>?> ManualCaptureAsync(string cameraIndexCode) =>
          await SecureCenterApis.PostAsync<ResPicUrl>("/api/video/v1/manualCapture", 1.2, new { cameraIndexCode = cameraIndexCode });
        /// <summary>
        /// 监控点3D放大 /api/video/v1/ptzs/selZoom
        /// 根据监控点编号进行云台操作接口
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.2及以上版本</remarks>
        /// <param name="cameraIndexCode">必填 监控点唯一标识，分页获取监控点资源接口获取返回参数cameraIndexCode</param>
        /// <param name="startX">必填 开始放大的X坐标，范围：0-255。由于设备比例限制，以及实际场景屏幕比例大小不同，
        /// 请按照如下坐标位计算方式计算入参：屏幕X坐标/屏幕宽 * 255，即该坐标位X坐标占总屏幕宽的比例*255。
        /// 监控点会对startX、startY、endX 、endY四点围成的区域进行放大。</param>
        /// <param name="startY">必填 开始放大的Y坐标，范围：0-255，由于设备比例限制，以及实际场景屏幕比例大小不同，
        /// 请按照如下坐标位计算方式计算入参：屏幕Y坐标/屏幕高 * 255，即该坐标位Y坐标占总屏幕高的比例*255。
        /// 监控点会对startX、startY、endX 、endY四点围成的区域进行放大。</param>
        /// <param name="endX">必填 结束放大的X坐标，范围以及计算方式同startX</param>
        /// <param name="endY">必填 结束放大的Y坐标，范围以及计算方式同startY</param>
        /// <returns><see cref="ResPtzsSelZoom"/></returns>
        public async Task<ResParameter<ResPtzsSelZoom>?> PtzsSelZoomAsync(string cameraIndexCode, int startX, int startY, int endX, int endY) =>
          await SecureCenterApis.PostAsync<ResPtzsSelZoom>("/api/video/v1/ptzs/selZoom", 1.2, new
          {
              cameraIndexCode = cameraIndexCode,
              startX = startX,
              startY = startY,
              endX = endX,
              endY = endY
          });

        #region 手动录像
        /// <summary>
        /// 录像锁定与解锁 /api/video/v1/record/lock
        /// 通过向中心存储接入服务下发锁定/解锁指定编码器，指定时间段的录像。
        /// 进行录像锁定/解锁操作的用户需要配置相应监控点的录像回放权限，本接口会根据合作方的userId进行权限过滤。
        /// 仅支持中心存储，暂不支持设备存储。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.4及以上版本</remarks>
        /// <param name="cameraIndexCode">必填 监控点唯一标识，分页获取监控点资源接口获取返回参数cameraIndexCode</param>
        /// <param name="startTime">必填 开始时间（IOS8601格式：yyyy-MM-dd’T’HH:mm:ss.SSSzzz +当前时区，例如北京时间：2018-07-26T15:00:00.000+08:00）</param>
        /// <param name="endTime">必填 结束时间（IOS8601格式：yyyy-MM-dd’T’HH:mm:ss.SSSzzz +当前时区，例如北京时间：2018-07-26T15:00:00.000+08:00）</param>
        /// <param name="lockTime">必填 	锁定时长，单位：秒，为0时表示解锁，取值范围：0-1576800000</param>
        /// <param name="type">非必填 下发的存储类型。0-中心存储，1-设备存储。如果不传入，默认为0-中心存储</param>
        /// <returns><see cref="ResParameter{T}"/></returns>
        public async Task<ResParameter<object>?> RecordLockAsync(string cameraIndexCode, string startTime, string endTime, int lockTime, int type = 0) =>
          await SecureCenterApis.PostAsync<object>("/api/video/v1/record/lock", 1.4, new
          {
              cameraIndexCode = cameraIndexCode,
              startTime = startTime,
              endTime = endTime,
              lockTime = lockTime,
              type = type
          });
        /// <summary>
        /// 开始手动录像 /api/video/v1/manualRecord/start
        /// 1.该接口用于向存储接入服务下发开始手动录像请求，将前端实时流存储到存储设备上，支持中心存储和设备存储两种存储模式。萤石设备不支持手动录像功能。
        /// 2.由于开始手动录像命令需要先下发到sac再到存储，实际录像开始时间与调用接口时间会稍有延迟。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.3及以上版本</remarks>
        /// <param name="cameraIndexCode">必填 监控点唯一标识，分页获取监控点资源接口获取返回参数cameraIndexCode</param>
        /// <param name="recordType">非必填 录像类型：范围:0-65535，中心存储必填，设备存储不传入。 参考附录A.31 录像类型
        /// https://open.hikvision.com/docs/0f6e8e1e41a14304aeecd287530b9c95?curNodeId=0f6e8e1e41a14304aeecd287530b9c95#ef7cdc5a
        /// 定时录像	0
        /// 移动侦测	1
        /// 报警触发	2
        /// 报警触发或移动侦测	3
        /// 报警触发和移动侦测	4
        /// 命令触发	5
        /// 手动录像	6
        /// 智能录像	7
        /// PIR报警	10
        /// 无线报警	11
        /// 呼救报警	12
        /// 全部事件	13
        /// 智能交通事件	14
        /// 越界侦测	15
        /// 区域入侵	16
        /// 声音异常	17
        /// 场景变更侦测	18
        /// 智能侦测（越界侦测\区域入侵\人脸侦测\声音异常\场景变更侦测）	19
        /// 人脸侦测	20
        /// 信号量	21
        /// 回传	22
        /// 回迁录像	23
        /// 遮挡	24
        /// pos录像	25
        /// 进入区域侦测	26
        /// 离开区域侦测	27
        /// 徘徊侦测	28
        /// 人员聚集侦测	29
        /// 快速运动侦测	30
        /// 停车侦测	31
        /// 物品遗留侦测	32
        /// 物品拿取侦测	33
        /// 火点侦测	34
        /// 防破坏侦测	35
        /// 船只检测	36
        /// 测温预警	37
        /// 测温报警	38
        /// 打架斗殴报警	39
        /// 起身检测	40
        /// 瞌睡检测	41
        /// 温差报警	42
        /// 离线测温报警	43
        /// 防区报警	44
        /// 紧急求助	45
        /// 业务咨询	46
        /// 起身检测	47
        /// 折线攀高	48
        /// 如厕超时	49
        /// 奔跑检测	50
        /// 滞留检测	51
        /// </param>
        /// <param name="type">非必填 下发的存储类型。0-中心存储 1-设备存储。如果不传入，默认为0-中心存储</param>
        /// <returns><see cref="ManualRecordTask"/></returns>
        public async Task<ResParameter<ManualRecordTask>?> RecordStartAsync(string cameraIndexCode, int? recordType = null, int type = 0) =>
          await SecureCenterApis.PostAsync<ManualRecordTask>("/api/video/v1/manualRecord/start", 1.3, new
          {
              cameraIndexCode = cameraIndexCode,
              recordType = recordType,
              type = type
          });
        /// <summary>
        /// 停止手动录像 /api/video/v1/manualRecord/stop
        /// 1.该接口用于根据手动录像任务ID，向存储接入服务下发停止手动录像请求, 支持中心存储和设备存储两种存储模式。萤石设备不支持手动录像功能。
        /// 2.由于停止手动录像命令需要先下发到sac再到存储，实际录像结束时间与调用接口时间会稍有延迟。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.5及以上版本</remarks>
        /// <param name="req">参数</param>
        /// <returns><see cref="ResParameter{T}"/></returns>
        public async Task<ResParameter<object>?> RecordStopAsync(ManualRecordTask req) =>
          await SecureCenterApis.PostAsync<object>("/api/video/v1/manualRecord/stop", 1.5, req);
        /// <summary>
        /// 获取手动录像状态 /api/video/v1/manualRecord/status
        /// 该接口用于根据手动录像任务ID，向存储接入服务下发查询手动录像状态请求, 设备存储暂不支持该能力。萤石设备不支持手动录像功能。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.5及以上版本</remarks>
        /// <param name="req">查询参数</param>
        /// <returns><see cref="ResTaskStatus"/></returns>
        public async Task<ResParameter<ResTaskStatus>?> RecordStatusAsync(ManualRecordTask req) =>
          await SecureCenterApis.PostAsync<ResTaskStatus>("/api/video/v1/manualRecord/status", 1.5, req);
        /// <summary>
        /// 查询手动录像编号 /api/video/v1/manualRecord/taskId/search
        /// 该接口用于根据用户id获取当前用户创建的手动录像任务ID，用于获取手动录像状态和停止手动录像。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.4及以上版本</remarks>
        /// <param name="cameraIndexCodes">必填 监控点编号集合，一次性最多传入1000个监控点编号进行查询，分页获取监控点资源接口获取返回参数cameraIndexCode</param>
        /// <returns><see cref="ResRecordTaskIdSearch"/></returns>
        public async Task<ResParameter<ResRecordTaskIdSearch>?> RecordTaskIdSearchAsync(IList<string> cameraIndexCodes) =>
          await SecureCenterApis.PostAsync<ResRecordTaskIdSearch>("/api/video/v1/manualRecord/taskId/search", 1.4, new
          {
              cameraIndexCodes = cameraIndexCodes
          });
        #endregion

        #region 预埋点管理
        /// <summary>
        /// 设置预置点信息 /api/video/v1/presets/addition
        /// 该接口用于设置监控点的预置点信息，若参数传已经存在的预置点编号，则可修改预置点信息
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.2及以上版本</remarks>
        /// <param name="cameraIndexCode">必填 监控点唯一标识， 可通过分页获取监控点资源获取</param>
        /// <param name="presetName">必填 预置点名称</param>
        /// <param name="presetIndex">必填 预置点编号</param>
        /// <returns><see cref="ResParameter{T}"/></returns>
        public async Task<ResParameter<object>?> PresetsAdditionAsync(string cameraIndexCode, string presetName, int presetIndex) =>
          await SecureCenterApis.PostAsync<object>("/api/video/v1/presets/addition", 1.2, new { cameraIndexCode = cameraIndexCode, presetName = presetName, presetIndex = presetIndex });
        /// <summary>
        /// 查询预置点信息 /api/video/v1/presets/searches
        /// 该接口用于查询监控点的预置点信息。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.2及以上版本</remarks>
        /// <param name="cameraIndexCode">必填 监控点唯一标识， 可通过分页获取监控点资源获取</param>
        /// <returns><see cref="ResUrl"/></returns>
        public async Task<ResParameter<ResPageData<ResPresetsSearch>>?> PresetsSearchAsync(string cameraIndexCode) =>
          await SecureCenterApis.PostAsync<ResPageData<ResPresetsSearch>>("/api/video/v1/presets/searches", 1.2, new { cameraIndexCode = cameraIndexCode });
        /// <summary>
        /// 删除预置点信息 /api/video/v1/presets/deletion
        /// 该接口用于批量获取监控点的预置点信息列表。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.2及以上版本</remarks>
        /// <param name="cameraIndexCode">必填 监控点唯一标识， 可通过分页获取监控点资源获取</param>
        /// <param name="presetIndex">必填 预置点编号</param>
        /// <returns><see cref="ResParameter{T}"/></returns>
        public async Task<ResParameter<object>?> PresetsDelAsync(string cameraIndexCode, int presetIndex) =>
          await SecureCenterApis.PostAsync<object>("/api/video/v1/presets/deletion", 1.2, new { cameraIndexCode = cameraIndexCode, presetIndex = presetIndex });
        /// <summary>
        /// 批量获取监控点的预置点信息 /api/video/v1/presets/get
        /// 该接口用于批量获取监控点的预置点信息列表。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.3及以上版本</remarks>
        /// <param name="cameraIndexCodes">必填 监控点唯一标识集，可通过分页获取监控点资源获取</param>
        /// <returns><see cref="ResGetPresets"/></returns>
        public async Task<ResParameter<ResPageData<ResGetPresets>>?> GetPresetsAsync(IList<string> cameraIndexCodes) =>
          await SecureCenterApis.PostAsync<ResPageData<ResGetPresets>>("/api/video/v1/presets/get", 1.3, new { cameraIndexCodes = cameraIndexCodes });
        #endregion

        #region 图片获取
        /// <summary>
        /// 平台抓拍计划图片获取 /api/video/v1/pictureInfos
        /// 支持根据输入的监控点编号集合，分页获取通过平台配置抓图计划抓取的图片信息；或根据图片唯一标识获取单张图片信息。
        /// 若监控点编号集合和图片唯一标识均不传入，则分页查询出所有配置了抓图计划的监控点图片信息。
        /// 同时按照调用方指定的排序方式对图片进行排序。进行图片查询操作的用户需要配置相应监控点的图片查询权限，该接口会根据传入的userId对数据进行权限过滤。
        /// 建议：使用本接口前请先进行校时，确保本地时间与当前系统时间保持一致。全量查询时，结束时间请在当前时间的基础上至少提前一天，确保数据分页的准确性。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.4及以上版本</remarks>
        /// <param name="page">必填 页码，页大小，起始时间，结束时间</param>
        /// <param name="cameraIndexCodes">非必填 监控点编号集合，一次性最多传入5个监控点编号进行查询。与captureId取交集，两个参数都不传时返回所有配置了抓图计划的监控点的图片信息。</param>
        /// <param name="captureId">非必填 图片唯一标识，与cameraIndexCodes取交集，主要用于本接口全量查询后通过获取的图片唯一标识查询单张图片信息。</param>
        /// <param name="netProtocol">非必填 网络协议。“http”:HTTP协议、“https”:HTTPS协议。参数不填，优先返回https协议</param>
        /// <param name="sort">非必填 图片排序方式。0-按监控点排序，根据监控点名称ASCII码顺序排序。同一监控点的图片按照时间倒序排序；1-按时间排序，根据抓图时间倒序排序，最新的图片排在最前边。相同时间按监控点名称顺序排序。参数不填，默认按0-监控点排序。</param>
        /// <param name="compressRatio">非必填 图片质量压缩比。标识返回缩略图的图片质量压缩比。通过修改图片压缩比来改变图片大小（图片占用字节数），不会改变图片尺寸。取值范围为0-99，不传时默认为50，取值越小，表示压缩更多，图片失真越严重。</param>
        /// <returns><see cref="ResPictureInfos"/></returns>
        public async Task<ResParameter<ResPageData<ResPictureInfos>>?> PictureInfosAsync(ReqPageDate page, IList<string> cameraIndexCodes = null,
            string captureId = null, string netProtocol = "https", int sort = 0, int compressRatio = 50) =>
          await SecureCenterApis.PostAsync<ResPageData<ResPictureInfos>>("/api/video/v1/pictureInfos", 1.4, new
          {
              pageNo = page.pageNo,
              pageSize = page.pageSize,
              cameraIndexCodes = cameraIndexCodes,
              captureId = captureId,
              startTime = page.startTime,
              endTime = page.endTime,
              netProtocol = netProtocol,
              sort = sort,
              compressRatio = compressRatio
          });
        /// <summary>
        /// 视频图片查询 /api/video/v1/events/picture
        ///通过该接口根据输入的图片的相对Uri地址，可以获取到具体的图片数据
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.3及以上版本</remarks>
        /// <param name="svrIndexCode">必填 图片存储服务器唯一标识，提供picUri处会提供此字段</param>
        /// <param name="picUri">必填 图片的相对地址</param>
        /// <param name="netProtocol">非必填 网络协议。“http”:HTTP协议、“https”:HTTPS协议。参数不填，优先返回https协议</param>
        /// <returns><see cref="ResPicUrl"/></returns>
        public async Task<ResParameter<ResPicUrl>?> PictureAsync(string svrIndexCode, string picUri, string netProtocol) =>
          await SecureCenterApis.PostAsync<ResPicUrl>("/api/video/v1/events/picture", 1.3, new
          {
              svrIndexCode = svrIndexCode,
              picUri = picUri,
              netProtocol = netProtocol
          });
        #endregion

        #region 巡航路径
        /// <summary>
        /// 查询巡航路径 /api/video/v1/cruiseRoutes/search
        /// 查询巡航路径信息。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.4及以上版本</remarks>
        /// <param name="cameraIndexCode">必填 监控点唯一标识， 可通过分页获取监控点资源获取</param>
        /// <param name="nameLike">非必填 巡航路径名称，名称模糊搜索，为空或者为null时忽略此条件</param>
        /// <returns><see cref="ResCruiseRoutes"/></returns>
        public async Task<ResParameter<ResPageData<ResCruiseRoutes>>?> CruiseRoutesSearchAsync(string cameraIndexCode, string nameLike) =>
          await SecureCenterApis.PostAsync<ResPageData<ResCruiseRoutes>>("/api/video/v1/cruiseRoutes/search", 1.4, new
          {
              cameraIndexCode = cameraIndexCode,
              nameLike = nameLike
          });
        /// <summary>
        /// 添加或修改巡航路径 /api/video/v1/cruiseRoutes/update
        /// 本接口用于增加或修改巡航路径，存储巡航路径信息的同时下发到设备。
        /// 每台前端设备最多设置8个巡航路径，每条路径最多32个巡航点。
        /// 进行增加或修改巡航路径操作的用户需要配置相应监控点的云台控制权限。
        /// 级联点位不支持该功能。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.4及以上版本</remarks>
        /// <param name="cameraIndexCode">必填 监控点唯一标识， 可通过分页获取监控点资源获取</param>
        /// <param name="cruiseIndex">必填 巡航路径序号，范围：[1,8]，可通过查询巡航路径接口获取返回参数cruiseIndex</param>
        /// <param name="cruiseName">非必填 巡航路径名称，增加时，必须指定；修改时，如果为null或为空时不进行修改</param>
        /// <param name="points">巡航路径的轨迹点数据列表，增加时，必须指定；修改时，为null或为空时不进行修改。每次传入进行全量覆盖，一条巡航路径最多支持32个巡航点位，传入的巡航点有序</param>
        /// <returns><see cref="ResParameter{T}"/></returns>
        public async Task<ResParameter<object>?> CruiseRoutesUpdateAsync(string cameraIndexCode, int cruiseIndex, string cruiseName = null, IList<Points> points = null) =>
          await SecureCenterApis.PostAsync<object>("/api/video/v1/cruiseRoutes/update", 1.4, new
          {
              cameraIndexCode = cameraIndexCode,
              cruiseIndex = cruiseIndex,
              cruiseName = cruiseName,
              points = points
          });
        /// <summary>
        /// 删除巡航路径 /api/video/v1/cruiseRoutes/delete
        /// 本接口用于删除巡航路径，删除巡航路径信息的同时下发到设备。
        /// 进行删除巡航路径操作的用户需要配置相应监控点的云台控制权限，本接口会根据合作方的userId进行权限过滤。
        /// 级联点位不支持该功能。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.4及以上版本</remarks>
        /// <param name="cameraIndexCode">必填 监控点唯一标识， 可通过分页获取监控点资源获取</param>
        /// <param name="cruiseIndex">必填 巡航路径序号，范围：[1,8]，可通过查询巡航路径接口获取返回参数cruiseIndex</param>
        /// <returns><see cref="ResParameter{T}"/></returns>
        public async Task<ResParameter<object>?> CruiseRoutesDelAsync(string cameraIndexCode, int cruiseIndex) =>
          await SecureCenterApis.PostAsync<object>("/api/video/v1/cruiseRoutes/delete", 1.4, new
          {
              cameraIndexCode = cameraIndexCode,
              cruiseIndex = cruiseIndex
          });
        /// <summary>
        /// 巡航路径控制 /api/video/v1/cruiseRoutes/controlling
        /// 本接口用于进行巡航路径控制，包括开始、停止巡航两种操作。
        /// 进行巡航路径控制操作的用户需要配置相应监控点的云台控制权限，本接口会根据合作方的userId进行权限过滤。
        /// 级联点位不支持该功能。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.4及以上版本</remarks>
        /// <param name="cameraIndexCode">必填 监控点唯一标识,从分页获取监控点资源接口获取返回参数cameraIndexCode</param>
        /// <param name="command">必填 控制命令，不区分大小写，开始巡航：START_CRUISE；停止巡航：STOP_CRUISE</param>
        /// <param name="cruiseIndex">必填 巡航路径序号，范围：[1,8]，可通过查询巡航路径接口获取返回参数cruiseIndex</param>
        /// <returns><see cref="ResParameter{T}"/></returns>
        public async Task<ResParameter<object>?> CruiseRoutesControlAsync(string cameraIndexCode, string command, int cruiseIndex) =>
          await SecureCenterApis.PostAsync<object>("/api/video/v1/cruiseRoutes/controlling", 1.4, new
          {
              cameraIndexCode = cameraIndexCode,
              command = command,
              cruiseIndex = cruiseIndex
          });
        #endregion

        #region 视频参数配置
        /// <summary>
        /// 获取视频OSD显示参数 /api/video/v1/picParams/get
        /// 本接口用于根据监控点编号获取视频OSD显示参数配置。OSD(on-screen display)，即屏幕菜单式调节方式。
        /// 仅支持海康SDK、ehome两种协议的监控点，且级联点位不支持该功能。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.4及以上版本</remarks>
        /// <param name="cameraIndexCode">必填 监控点唯一标识,从分页获取监控点资源接口获取返回参数cameraIndexCode</param>
        /// <returns><see cref="ReqPicParams"/></returns>
        public async Task<ResParameter<ReqPicParams>?> GetPicParamsAsync(string cameraIndexCode) =>
          await SecureCenterApis.PostAsync<ReqPicParams>("/api/video/v1/picParams/get", 1.4, new { cameraIndexCode = cameraIndexCode });
        /// <summary>
        /// 获取视频叠加字符串参数 /api/video/v1/showStringParams/get
        /// 本接口用于根据监控点编号获取视频叠加字符串参数配置。
        /// 仅支持海康SDK、ehome两种协议的监控点，且级联点位不支持该功能。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.4及以上版本</remarks>
        /// <param name="cameraIndexCode">必填 监控点唯一标识,从分页获取监控点资源接口获取返回参数cameraIndexCode</param>
        /// <returns><see cref="ShowStringParams"/></returns>
        public async Task<ResParameter<ShowStringParams>?> GetShowStringParamsAsync(string cameraIndexCode) =>
          await SecureCenterApis.PostAsync<ShowStringParams>("/api/video/v1/showStringParams/get", 1.4, new { cameraIndexCode = cameraIndexCode });
        /// <summary>
        /// 获取预览画面参数配置 /api/video/v1/videoParams/get
        /// 本接口用于查询监控点的预览画面参数配置，包括亮度、灰度、对比度、饱和度。
        /// 仅支持海康SDK、ehome两种协议的监控点，且级联点位不支持该功能。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.4及以上版本</remarks>
        /// <param name="cameraIndexCode">必填 监控点唯一标识,从分页获取监控点资源接口获取返回参数cameraIndexCode</param>
        /// <returns><see cref="VideoParams"/></returns>
        public async Task<ResParameter<VideoParams>?> GetVideoParamsAsync(string cameraIndexCode) =>
          await SecureCenterApis.PostAsync<VideoParams>("/api/video/v1/videoParams/get", 1.4, new { cameraIndexCode = cameraIndexCode });
        /// <summary>
        /// 设置视频OSD显示参数 /api/video/v1/picParams/udpate
        /// 本接口用于设置视频OSD显示参数。OSD(on-screen display)，即屏幕菜单式调节方式。
        /// 仅支持海康SDK、ehome两种协议的监控点，且级联点位不支持该功能。
        /// 进行设置视频OSD显示参数操作的用户需要配置相应监控点的OSD叠加权限，本接口会根据传入的userId进行权限过滤。
        /// 注意：参数设置是否生效与设备支持情况有关，不同型号设备支持情况不同。本接口设置的Y坐标值和下发到设备中的值可能存在不一致的情况，
        /// 设备端OSD的Y坐标是有限制的，SDK协议下发是4字节对齐的，下发的值会进行转换成16的倍数。原因为：防止P制和N制切换时OSDY坐标的的较大偏移；
        /// OSD的最小字体就是16*16，如果Y坐标不做限制的话就会相互叠加在一块。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.4及以上版本</remarks>
        /// <param name="cameraIndexCode">必填 监控点唯一标识,从分页获取监控点资源接口获取返回参数cameraIndexCode</param>
        /// <param name="req">参数</param>
        /// <returns><see cref="ResParameter{T}"/></returns>
        public async Task<ResParameter<object>?> PicParamsUpdateAsync(string cameraIndexCode, ReqPicParams req) =>
          await SecureCenterApis.PostAsync<object>("/api/video/v1/picParams/udpate", 1.4, new
          {
              cameraIndexCode = cameraIndexCode,
              channelName = req.channelName,
              isShowChanName = req.isShowChanName,
              channelNameXPos = req.channelNameXPos,
              channelNameYPos = req.channelNameYPos,
              hourOSDType = req.hourOSDType,
              isShowOSD = req.isShowOSD,
              osdXPos = req.osdXPos,
              osdYPos = req.osdYPos,
              osdType = req.osdType,
              osdAttrib = req.osdAttrib,
              isShowWeek = req.isShowWeek,
          });
        /// <summary>
        /// 设置视频叠加字符串参数 /api/video/v1/showStringParams/udpate
        /// 本接口用于设置视频叠加字符串参数，每个监控点最多支持叠加4条字符串，每次设置会全覆盖之前设置的字符串信息。仅支持海康SDK、ehome两种协议的监控点，且级联点位不支持该功能。
        /// 注意：参数设置是否生效与设备支持情况有关，不同型号设备支持情况不同。
        /// 本接口设置的Y坐标值和下发到设备中的值可能存在不一致的情况，设备端叠加字符串的Y坐标是有限制的，SDK协议下发是4字节对齐的，
        /// 下发的值会进行转换成16的倍数。原因为：防止P制和N制切换时Y坐标的的较大偏移；叠加字符串的最小字体就是16*16，如果Y坐标不做限制的话就会相互叠加在一块。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.4及以上版本</remarks>
        /// <param name="cameraIndexCode">必填 监控点唯一标识,从分页获取监控点资源接口获取返回参数cameraIndexCode</param>
        /// <param name="showStringParams">必填 叠加字符串信息列表，最多叠加4条字符串，每次设置会全覆盖上次设置的字符串</param>
        /// <returns><see cref="ResParameter{T}"/></returns>
        public async Task<ResParameter<object>?> ShowStringParamsUpdateAsync(string cameraIndexCode, IList<ShowStringParams> showStringParams) =>
          await SecureCenterApis.PostAsync<object>("/api/video/v1/showStringParams/udpate", 1.4, new
          {
              cameraIndexCode = cameraIndexCode,
              showStringParams = showStringParams
          });
        /// <summary>
        /// 设置预览画面参数配置 /api/video/v1/videoParams/udpate
        /// 本接口用于设置监控点的预览画面参数配置，保存配置参数的同时下发到设备。仅支持海康SDK、ehome两种协议的监控点，且级联点位不支持该功能。
        /// 参数配置包括亮度、灰度、对比度、饱和度，配置参数的情况在预览监控点时影响画面展示效果。注意：参数设置是否生效与设备支持情况有关，不同型号设备支持情况不同。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.4及以上版本</remarks>
        /// <param name="cameraIndexCode">非必填 监控点唯一标识,从分页获取监控点资源接口获取返回参数cameraIndexCode</param>
        /// <param name="videoParams">非必填 亮度，范围：[1,10] 灰度，范围：[1,10] 对比度，范围：[1,10] 饱和度，范围：[1,10]</param>
        /// <returns><see cref="ResParameter{T}"/></returns>
        public async Task<ResParameter<object>?> VideoParamsUpdateAsync(string cameraIndexCode, VideoParams videoParams = null) =>
          await SecureCenterApis.PostAsync<object>("/api/video/v1/videoParams/udpate", 1.4, new
          {
              cameraIndexCode = cameraIndexCode,
              brightness = videoParams?.brightness ?? 1,
              hue = videoParams?.hue ?? 1,
              contrast = videoParams?.contrast ?? 1,
              saturation = videoParams?.saturation ?? 1
          });
        #endregion

        #region 报警输出
        /// <summary>
        /// 获取报警输出通道状态 /api/video/v1/alarmOut/status/get
        /// 本接口用于根据报警输出通道编号获取报警输出通道状态。目前仅支持海康sdk设备的报警输出通道状态获取。
        /// 进行报警输出通道状态获取操作的用户需要配置相应报警输出通道的查看权限，本接口会根据合作方的userId进行权限过滤。
        /// 级联点位不支持该功能。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.5及以上版本</remarks>
        /// <param name="channelIndexCode">必填 报警输出通道编号，查询报警输出列表接口获取返回参数indexCode</param>
        /// <returns>data => {status : 1} 状态，0-停止输出，1-输出</returns>
        public async Task<ResParameter<object>?> GetAlarmOutStatusAsync(string channelIndexCode) =>
          await SecureCenterApis.PostAsync<object>("/api/video/v1/alarmOut/status/get", 1.5, new { channelIndexCode = channelIndexCode });
        /// <summary>
        /// 配置报警输出通道状态 /api/video/v1/alarmOut/status/set
        /// 本接口用于根据报警输出通道编号获取报警输出通道状态。目前仅支持海康sdk设备的报警输出通道状态获取。
        /// 进行报警输出通道状态获取操作的用户需要配置相应报警输出通道的查看权限，本接口会根据合作方的userId进行权限过滤。
        /// 级联点位不支持该功能。
        /// </summary>
        /// <remarks>综合安防管理平台iSecure Center V1.5及以上版本</remarks>
        ///  <param name="channelIndexCode">必填 报警输出通道编号，查询报警输出列表接口获取返回参数indexCode</param>
        ///   <param name="status">必填 状态，0-停止输出，1-输出</param>
        /// <returns><see cref="ResParameter{T}"/></returns>
        public async Task<ResParameter<object>?> SetAlarmOutStatusAsync(string channelIndexCode, int status) =>
          await SecureCenterApis.PostAsync<object>("/api/video/v1/alarmOut/status/set", 1.5, new { channelIndexCode = channelIndexCode, status = status });
        #endregion
    }
}
